home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / modelers / geomview / source.lha / Geomview / src / lib / gprim / geom / create.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-08-31  |  3.5 KB  |  161 lines

  1. /* Copyright (c) 1992 The Geometry Center; University of Minnesota
  2.    1300 South Second Street;  Minneapolis, MN  55454, USA;
  3.    
  4. This file is part of geomview/OOGL. geomview/OOGL is free software;
  5. you can redistribute it and/or modify it only under the terms given in
  6. the file COPYING, which you should have received along with this file.
  7. This and other related software may be obtained via anonymous ftp from
  8. geom.umn.edu; email: software@geom.umn.edu. */
  9. static char *copyright = "Copyright (C) 1992 The Geometry Center";
  10.  
  11. /* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */
  12.  
  13. #include "geomclass.h"
  14.  
  15. Geom *
  16. GeomCreate(char *type, ...)
  17. {
  18.     va_list a_list;
  19.     Geom *newgeom = (Geom *) NULL;
  20.     GeomClass *Class = (GeomClass *) NULL;
  21.  
  22.     va_start (a_list, type);
  23.     Class = GeomClassLookup(type);
  24.     /* now use the create method to get a new geom ... */
  25.     if (Class == NULL) {
  26.     GeomError(0/*Unknown Class XXX*/, "GeomCreate: unknown object class %s", type);
  27.     va_end (a_list);
  28.     return NULL;
  29.     }
  30.  
  31.     if (Class->create)
  32.         newgeom = (Geom *) (*Class->create)(NULL, Class, a_list);
  33.     /* need error check here */
  34.  
  35.     va_end (a_list);
  36.     return newgeom;
  37. }
  38.  
  39. int
  40. GeomSet(Geom *g, ...)
  41. {
  42.     int ok = -1;
  43.     va_list a_list;
  44.  
  45.     va_start (a_list, g);
  46.  
  47.     if (g && g->Class && g->Class->create)
  48.         if((*g->Class->create)(g, g->Class, a_list))
  49.         ok = 1;
  50.  
  51.     va_end (a_list);
  52.     return ok;
  53. }
  54.  
  55.  
  56. int
  57. GeomGet(Geom *g, int attr, void *attrp)
  58. {
  59.     if(g == NULL)
  60.     return -1;
  61.  
  62.     switch(attr) {
  63.     case CR_APPEAR:
  64.     *(Appearance **)attrp = g->ap;
  65.     break;
  66.     case CR_HANDLE:
  67.     *(Handle **)attrp = g->handle;
  68.     break;
  69.     default:
  70.     if(g->Class->get)
  71.         return (*g->Class->get)(g, attr, attrp);
  72.     }
  73.     return 0;
  74. }
  75.  
  76.     
  77. Geom *
  78. GeomCCreate(Geom *g, GeomClass *c, ...)
  79. {
  80.     va_list a_list;
  81.     Geom *newgeom = g;
  82.     GeomClass *Class = c;
  83.     char *type;
  84.  
  85.     va_start (a_list, c);
  86.     if(Class == NULL && newgeom != NULL)
  87.     Class = newgeom->Class;
  88.  
  89.     if (Class && Class->create)
  90.         newgeom = (Geom *) (*Class->create)(newgeom, Class, a_list);
  91.     /* need error check here */
  92.  
  93.     va_end (a_list);
  94.     return newgeom;
  95. }
  96.  
  97. /*
  98.  * Initialize common data for Geom objects
  99.  */
  100. GGeomInit(g, Class, magic, ap)
  101.     int magic;
  102.     register Geom *g;
  103.     GeomClass *Class;
  104.     Appearance *ap;
  105. {
  106.     RefInit((Ref *)g, magic);
  107.     g->Class = Class;
  108.     g->ap = ap;
  109.     if(ap != NULL)    /* If it's a real Appearance, bump its ref count */
  110.     RefIncr((Ref *)ap);
  111.     g->aphandle = NULL;
  112.     g->geomflags = 0; 
  113. }
  114.  
  115. /*
  116.  * Handle one exceptional item from a GeomCreate() arg list.
  117.  * We know how to set common Geom fields.
  118.  */
  119. GeomDecorate(g, copyp, feature, ap)
  120.     Geom *g;
  121.     register int *copyp;/* Flag: "copy" parameters passed by reference? */
  122.     int feature;    /* Attribute -- value already va_arg'ed by caller */
  123.     register va_list *ap;
  124. {
  125.     Handle *hand;
  126.     Appearance *nap;
  127.     int val;
  128.  
  129.     if(feature == 0 || g == NULL)
  130.     return 1;
  131.  
  132.     switch(feature) {
  133.     case CR_4D:        /* this is a token, value pair so it can be
  134.             set conditionally */
  135.     val = va_arg(*ap, int);
  136.      g->geomflags |= val ? VERT_4D : 0;
  137.     break;
  138.     case CR_APPEAR:        /* Assign or remove Appearance.  */
  139.     nap = va_arg(*ap, Appearance *);
  140.     if(nap && *copyp) RefIncr((Ref *)nap);
  141.     if(g->ap) ApDelete(g->ap);
  142.     g->ap = nap;
  143.     break;
  144.     case CR_COPY:
  145.     *copyp = 1;
  146.     break;
  147.     case CR_NOCOPY:
  148.     *copyp = 0;
  149.     break;
  150.     default:
  151.     return 1; /* Unknown attribute */
  152.     }
  153.     return 0;
  154. }
  155.  
  156. Appearance *
  157. GeomAppearance(Geom *g)
  158. {
  159.     return g ? g->ap : NULL;
  160. }
  161.